package com.blueocean_health.care.management.common.base.pdf.nurse;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import org.apache.commons.io.IOUtils;
import org.springframework.core.io.ClassPathResource;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.blueocean_health.care.management.common.base.em.TimeType;
import com.blueocean_health.care.management.common.base.string.StringUtils;
import com.blueocean_health.care.management.common.base.time.TimeUtils;
import com.blueocean_health.care.management.domain.dto.NurseWorkerInfoDto;
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;

/**
* 护工下载档案
* @author huyanqiu
* @date 2017年12月15日 下午3:51:35
* @version 版本号：1.0
*/
public class NursePdfUtils {
	
//	public static void main(String[] args) throws Exception{
//		List<NurseWorkerInfo> infoList = new LinkedList<>();
//		NurseWorkerInfo bean = new NurseWorkerInfo();
//		bean.setWorkerName("张靓颖张靓颖");
//		bean.setSexName("女");
//		bean.setHireDate(TimeUtils.getDateByString("2017-10-10", TimeType.yyyy_MM_dd));
//		bean.setHeight("180");
//		bean.setWeight("80");
//		bean.setServiceYears(11);
//		bean.setPhone("18607980107");
//		bean.setIdCard("3602021993121523030");
//		bean.setProvinceName("河北");
//		bean.setContact("紧急联系人联系人");
//		bean.setContactPhone("18778886666");
//		bean.setSkill("紧急联系人紧急联系人紧急联系人紧急联系人紧急联系人紧急联系人紧急联系人紧急联系人");
//		bean.setAvatarPhotoUrl("15132166623086579056_head.jpg");
//		bean.setHealthCertPhotoUrl("15132166623086579056_heal.jpg");
//		bean.setEducationPhotoUrl("15132166623086579056_educ.jpg");
//		bean.setIdCardFacePhotoUrl("15132166623086579056_face.jpg");
//		infoList.add(bean);
//		infoList.add(bean);
//		exportNurseBaseMessagePdf(new FileOutputStream("C:/Users/12240/Desktop/test.pdf"), infoList, "http://localhost:10002/care-management/pdf/", "D:/test/pdf/");
//		getConfigurationFile();
//	}
	
	/**
	 * 加载导出护工资料的配置文件(nurseExportProps.txt)
	 * @return
	 */
	public static JSONObject getConfigurationFile() {
		StringBuffer sb = new StringBuffer();
		List<String> strList;
		try {
			strList = IOUtils.readLines(new ClassPathResource("nurseFile/nurseExportProps.json").getInputStream(), "UTF-8");
			strList.forEach(str -> {
				sb.append(str);
			});
		} catch (Exception e) {
		} 
		// 配置文件对象
		JSONObject propJSON = JSON.parseObject(sb.toString());
		return propJSON;
	}
	
	/**
	 * 导出护工基本信息
	 * @param fos
	 * @param infoList
	 * @param pdfPath http://localhost:10002/care-management/pdf/
	 * @param pdfpicturepath  D:/test/pdf/
	 */
	public static void exportNurseBaseMessagePdf(OutputStream fos, List<NurseWorkerInfoDto> infoList, String pdfPath, String pdfpicturepath) throws Exception{
		if (infoList.isEmpty() || StringUtils.isEmpty(fos)) {
			throw new RuntimeException("参数有误");
		}
		// 第一步：获取配置文件来动态生成pdf文件
		JSONObject propJSON = getConfigurationFile(); 
		// 具体的配置信息
		JSONArray propArray = propJSON.getJSONObject("context").getJSONArray("item");
		Document document = new Document(PageSize.A4);
		PdfWriter writer =PdfWriter.getInstance(document, fos);
		// 设置字体
		BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
		document.open();
		for(NurseWorkerInfoDto info : infoList) {
			// 遍历配置文件 一次一页
			for (int i=0; i<propArray.size(); i++) {
				JSONObject jsonObject = propArray.getJSONObject(i);
				if ("text".equals(jsonObject.get("type"))) {
					PdfContentByte textCb = writer.getDirectContent();
					textCb.beginText();
					textCb.setFontAndSize(bfChinese, jsonObject.getFloatValue("size"));
					textCb.setTextMatrix(jsonObject.getFloatValue("x"), jsonObject.getFloatValue("y"));
					String format = jsonObject.getString("format");
					if ("".equals(format)) {
						textCb.showText(jsonObject.getString("defaultValue")); // 使用默认值
					} else {
						// 方法名称
						String methodName = getMethodName(jsonObject.getString("attr"));
						Method method = NurseWorkerInfoDto.class.getMethod(methodName);
						String txt = "";
						// 日期格式
						if (format.contains("%d") && !StringUtils.isEmpty(method.invoke(info))) {
							String date = TimeUtils.getStringByDate((Date)method.invoke(info), TimeType.yyyy_MM_dd);
							txt = jsonObject.getString("defaultValue")+date+jsonObject.getString("unit");
						} else {
							String fillValue = (StringUtils.isEmpty(method.invoke(info))?"":(method.invoke(info)+jsonObject.getString("unit")));
							// 姓名或紧急联系人（限制多显示5个字，如果太长显示...）
							if ("workerName".equals(jsonObject.getString("attr")) || "contact".equals(jsonObject.getString("attr"))) {
								if (fillValue.length()>5) {
									fillValue = fillValue.substring(0, 5)+"...";
								}
							}
							// 护理技能
							if ("skill".equals(jsonObject.getString("attr"))) {
								if (fillValue.length()>39) {
									fillValue = fillValue.substring(0, 38)+"...";
								}
							}
							txt = jsonObject.getString("defaultValue")+fillValue;
						}
						textCb.showText(txt); 
					}
					textCb.endText();
				} else if ("image".equals(jsonObject.get("type"))) {
					// 方法名称
					String methodName = getMethodName(jsonObject.getString("attr"));
					Method method = NurseWorkerInfoDto.class.getMethod(methodName);
					// 数据库中存储URL
					String url = pdfPath + method.invoke(info);
					Image image = null;
					if (!StringUtils.isEmpty(method.invoke(info)) && new File(pdfpicturepath+method.invoke(info)).exists()) {
						// 使用数据库中存储的值
						image = Image.getInstance(url);
					} else {
						image = Image.getInstance(pdfPath+jsonObject.getString("defaultValue"));
					}
					image.scaleToFit(jsonObject.getFloatValue("width"), jsonObject.getFloatValue("height"));//设置图片的显示大小 长250  宽 300
					image.setAbsolutePosition(jsonObject.getFloatValue("x"),jsonObject.getFloatValue("y"));//图片坐标
					document.add(image);
				}
			}
			// 创建新页面
			document.newPage(); 
		}
		document.close();
	}
	
	/**
	 * 获得方法名称
	 * @param name workerName
	 * @return getWorkerName
	 */
    private static String getMethodName(String name) {
        return "get"+(name.substring(0, 1).toUpperCase() + name.substring(1));
    }
}